package com.indexingsystem.boss.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;

public class FileManipulationTool {

	/**
	 * 复制单个文件
	 * 
	 * @param oldPath
	 *            String 原文件路径 如：c:/fqf.txt
	 * @param newPath
	 *            String 复制后路径 如：f:/fqf.txt
	 * @return boolean
	 */
	public void copyFile(String oldPath, String newPath) {
		try {
			int bytesum = 0;
			int byteread = 0;
			File oldfile = new File(oldPath);
			if (oldfile.exists()) { // 文件存在时
				InputStream inStream = new FileInputStream(oldPath); // 读入原文件
				FileOutputStream fs = new FileOutputStream(newPath);
				byte[] buffer = new byte[1024*1024];
				while ((byteread = inStream.read(buffer)) != -1) {
					bytesum += byteread; // 字节数 文件大小
					System.out.println(bytesum);
					fs.write(buffer, 0, byteread);
				}
				inStream.close();
			}
		} catch (Exception e) {
			System.out.println("复制单个文件操作出错");
			e.printStackTrace();

		}

	}

	/**
	 * 复制单个文件
	 * 
	 * @param oldPath
	 *            String 原文件路径 如：c:/fqf.txt
	 * @param newPath
	 *            String 复制后路径 如：f:/fqf.txt
	 * @return boolean 速度快一些
	 */
	@SuppressWarnings("unused")
	private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
		FileUtils.copyFile(source, dest);
	}
	
	
	/**
	 * 报刊及图书目录从源文件目录复制到筛选后的目标文件目录.
	 * @param source
	 * @param target
	 */
	public static void copyStoreUpdateFolder(String source,String target){
	   try{
        FileUtils.copyDirectory(new File(source),new File(target));
       }
        catch (IOException e){
            e.printStackTrace();
        }
	}
	

	/**
	 * 复制整个文件夹内容
	 * 
	 * @param oldPath
	 *            String 原文件路径 如：c:/fqf
	 * @param newPath
	 *            String 复制后路径 如：f:/fqf/ff
	 * @return boolean
	 */
	public static void copyFolder(String oldPath, String newPath) {
		try {
			(new File(newPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹
			File a = new File(oldPath);
			String[] file = a.list();
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}
				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString());
					byte[] b = new byte[1024*1024];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				}
				if (temp.isDirectory()) {// 如果是子文件夹
					copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
				}
				
				
				
			}
		} catch (Exception e) {
			System.out.println("复制整个文件夹内容操作出错:"+oldPath);
			/*e.printStackTrace();*/

		}
	}

	/**
	 * 在指定的文件名中查找对应的字符串，存在就将该文件名绝对路径打印出来.
	 * 
	 * @param fileName
	 * @param srcStr
	 */
	public static void searchFile(String fileName, String srcStr) {
		File file = new File(fileName);
		try {
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			String strLine = "";
			while ((strLine = br.readLine()) != null) {
				if (strLine.indexOf(srcStr) > 0) {
					System.out.println(fileName);
					break;
				}
			}
			br.close();
			fr.close();
		} catch (Exception e) {

			e.printStackTrace();
		}
	}

	/**
	 * 在指定的绝对路径查找指定的字符串.
	 * 
	 * @param path
	 * @param srcStr
	 */
	public static void searchPath(String path, String srcStr) {
		File file = new File(path);
		if (file.isDirectory()) {
			File[] fileList = file.listFiles();
			for (int i = 0; i < fileList.length; i++) {
				if (fileList[i].isDirectory()) {
					searchPath(fileList[i].getAbsolutePath(), srcStr);
				} else {
					searchFile(fileList[i].getAbsolutePath(), srcStr);
				}
			}
		} else {
			searchFile(path, srcStr);
		}
	}
}